{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 一、前言"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "今天是第9天，我们将开始RNN系列，完成股票开盘价格的预测，最后的R2可达到`0.72`，CNN系列后续我也会穿插更新"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "🔥本文 GitHub [https://github.com/kzbkzb/Python-AI](https://github.com/kzbkzb/Python-AI) 已收录\n",
    "\n",
    "- 作者：[K同学啊](https://mp.weixin.qq.com/s/NES9RhtAhbX_jsmGua28dA)\n",
    "- 来自专栏：《深度学习100例》-Tensorflow2版本\n",
    "- 数据链接：https://pan.baidu.com/s/1ojOSS8I7F4E_uoPBq0HTUg （提取码：94ho）\n",
    "\n",
    "我的环境：\n",
    "\n",
    "- 语言环境：Python3.6.5\n",
    "- 编译器：jupyter notebook\n",
    "- 深度学习环境：TensorFlow2.4.1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "往期精彩内容：\n",
    "\n",
    "- [**深度学习100例-卷积神经网络（CNN）实现mnist手写数字识别 | 第1天**](https://mtyjkh.blog.csdn.net/article/details/116920825)\n",
    "- [**深度学习100例-卷积神经网络（CNN）服装图像分类 | 第3天**](https://mtyjkh.blog.csdn.net/article/details/116992196)\n",
    "- [**深度学习100例-卷积神经网络（CNN）花朵识别 | 第4天**](https://mtyjkh.blog.csdn.net/article/details/117079919)\n",
    "- [**深度学习100例-卷积神经网络（CNN）天气识别 | 第5天**](https://mtyjkh.blog.csdn.net/article/details/117186183)\n",
    "- [**深度学习100例-卷积神经网络（VGG-16）识别海贼王草帽一伙 | 第6天**](https://blog.csdn.net/qq_38251616/article/details/117331631)\n",
    "- [**深度学习100例 -卷积神经网络（ResNet-50）鸟类识别 | 第8天**](https://mtyjkh.blog.csdn.net/article/details/117587326)\n",
    "\n",
    "**来自专栏：**[**【深度学习100例】**](https://blog.csdn.net/qq_38251616/category_11068756.html)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**转载请通过左侧联系方式（电脑端可看）联系我，备注：CSDN转载**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "heading_collapsed": true
   },
   "source": [
    "# 二、RNN的基本原理"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hidden": true
   },
   "source": [
    "传统神经网络的结构比较简单：输入层 – 隐藏层 – 输出层"
   ]
  },
  {
   "attachments": {
    "image.png": {
     "image/png": "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"
    }
   },
   "cell_type": "markdown",
   "metadata": {
    "hidden": true
   },
   "source": [
    "![image.png](attachment:image.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hidden": true
   },
   "source": [
    "RNN 跟传统神经网络最大的区别在于每次都会将前一次的输出结果，带到下一次的隐藏层中，一起训练。如下图所示："
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hidden": true
   },
   "source": [
    "<img src=\"pictures/2019-07-02-rnn-1.gif\" align=\"center\">"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hidden": true
   },
   "source": [
    "这里用一个具体的案例来看看 RNN 是如何工作的：\n",
    "\n",
    "用户说了一句“what time is it？”，我们的神经网络会先将这句话分为五个基本单元（四个单词+一个问号）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hidden": true
   },
   "source": [
    "<img src=\"pictures/2019-07-02-fenci.gif\" align=\"center\">"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hidden": true
   },
   "source": [
    "然后，按照顺序将五个基本单元输入RNN网络，先将 “what”作为RNN的输入，得到输出`01`"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hidden": true
   },
   "source": [
    "<img src=\"pictures/2019-07-02-input-what.gif\" align=\"center\">"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hidden": true
   },
   "source": [
    "随后，按照顺序将“time”输入到RNN网络，得到输出`02`。\n",
    "\n",
    "这个过程我们可以看到，输入 “time” 的时候，前面“what” 的输出也会对`02`的输出产生了影响（隐藏层中有一半是黑色的）。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hidden": true
   },
   "source": [
    "<img src=\"pictures/2019-07-02-fenci-2.gif\" align=\"center\">"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hidden": true
   },
   "source": [
    "以此类推，我们可以看到，前面所有的输入产生的结果都对后续的输出产生了影响（可以看到圆形中包含了前面所有的颜色）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hidden": true
   },
   "source": [
    "<img src=\"pictures/2019-07-02-input-5.gif\" align=\"center\">"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hidden": true
   },
   "source": [
    "当神经网络判断意图的时候，只需要最后一层的输出`05`，如下图所示："
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hidden": true
   },
   "source": [
    "<img src=\"pictures/2019-07-02-rnn-2.gif\" align=\"center\">"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 三、准备工作"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.设置GPU"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "如果使用的是CPU可以注释掉这部分的代码。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import tensorflow as tf\n",
    "\n",
    "gpus = tf.config.list_physical_devices(\"GPU\")\n",
    "\n",
    "if gpus:\n",
    "    tf.config.experimental.set_memory_growth(gpus[0], True)  #设置GPU显存用量按需使用\n",
    "    tf.config.set_visible_devices([gpus[0]],\"GPU\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.加载数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os,math\n",
    "from tensorflow.keras.layers import Dropout, Dense, SimpleRNN\n",
    "from sklearn.preprocessing   import MinMaxScaler\n",
    "from sklearn                 import metrics\n",
    "import numpy             as np\n",
    "import pandas            as pd\n",
    "import tensorflow        as tf\n",
    "import matplotlib.pyplot as plt\n",
    "# 支持中文\n",
    "plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Unnamed: 0</th>\n",
       "      <th>date</th>\n",
       "      <th>open</th>\n",
       "      <th>close</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>volume</th>\n",
       "      <th>code</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>74</td>\n",
       "      <td>2010-04-26</td>\n",
       "      <td>88.702</td>\n",
       "      <td>87.381</td>\n",
       "      <td>89.072</td>\n",
       "      <td>87.362</td>\n",
       "      <td>107036.13</td>\n",
       "      <td>600519</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>75</td>\n",
       "      <td>2010-04-27</td>\n",
       "      <td>87.355</td>\n",
       "      <td>84.841</td>\n",
       "      <td>87.355</td>\n",
       "      <td>84.681</td>\n",
       "      <td>58234.48</td>\n",
       "      <td>600519</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>76</td>\n",
       "      <td>2010-04-28</td>\n",
       "      <td>84.235</td>\n",
       "      <td>84.318</td>\n",
       "      <td>85.128</td>\n",
       "      <td>83.597</td>\n",
       "      <td>26287.43</td>\n",
       "      <td>600519</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>77</td>\n",
       "      <td>2010-04-29</td>\n",
       "      <td>84.592</td>\n",
       "      <td>85.671</td>\n",
       "      <td>86.315</td>\n",
       "      <td>84.592</td>\n",
       "      <td>34501.20</td>\n",
       "      <td>600519</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>78</td>\n",
       "      <td>2010-04-30</td>\n",
       "      <td>83.871</td>\n",
       "      <td>82.340</td>\n",
       "      <td>83.871</td>\n",
       "      <td>81.523</td>\n",
       "      <td>85566.70</td>\n",
       "      <td>600519</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2421</th>\n",
       "      <td>2495</td>\n",
       "      <td>2020-04-20</td>\n",
       "      <td>1221.000</td>\n",
       "      <td>1227.300</td>\n",
       "      <td>1231.500</td>\n",
       "      <td>1216.800</td>\n",
       "      <td>24239.00</td>\n",
       "      <td>600519</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2422</th>\n",
       "      <td>2496</td>\n",
       "      <td>2020-04-21</td>\n",
       "      <td>1221.020</td>\n",
       "      <td>1200.000</td>\n",
       "      <td>1223.990</td>\n",
       "      <td>1193.000</td>\n",
       "      <td>29224.00</td>\n",
       "      <td>600519</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2423</th>\n",
       "      <td>2497</td>\n",
       "      <td>2020-04-22</td>\n",
       "      <td>1206.000</td>\n",
       "      <td>1244.500</td>\n",
       "      <td>1249.500</td>\n",
       "      <td>1202.220</td>\n",
       "      <td>44035.00</td>\n",
       "      <td>600519</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2424</th>\n",
       "      <td>2498</td>\n",
       "      <td>2020-04-23</td>\n",
       "      <td>1250.000</td>\n",
       "      <td>1252.260</td>\n",
       "      <td>1265.680</td>\n",
       "      <td>1247.770</td>\n",
       "      <td>26899.00</td>\n",
       "      <td>600519</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2425</th>\n",
       "      <td>2499</td>\n",
       "      <td>2020-04-24</td>\n",
       "      <td>1248.000</td>\n",
       "      <td>1250.560</td>\n",
       "      <td>1259.890</td>\n",
       "      <td>1235.180</td>\n",
       "      <td>19122.00</td>\n",
       "      <td>600519</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>2426 rows × 8 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      Unnamed: 0        date      open     close      high       low  \\\n",
       "0             74  2010-04-26    88.702    87.381    89.072    87.362   \n",
       "1             75  2010-04-27    87.355    84.841    87.355    84.681   \n",
       "2             76  2010-04-28    84.235    84.318    85.128    83.597   \n",
       "3             77  2010-04-29    84.592    85.671    86.315    84.592   \n",
       "4             78  2010-04-30    83.871    82.340    83.871    81.523   \n",
       "...          ...         ...       ...       ...       ...       ...   \n",
       "2421        2495  2020-04-20  1221.000  1227.300  1231.500  1216.800   \n",
       "2422        2496  2020-04-21  1221.020  1200.000  1223.990  1193.000   \n",
       "2423        2497  2020-04-22  1206.000  1244.500  1249.500  1202.220   \n",
       "2424        2498  2020-04-23  1250.000  1252.260  1265.680  1247.770   \n",
       "2425        2499  2020-04-24  1248.000  1250.560  1259.890  1235.180   \n",
       "\n",
       "         volume    code  \n",
       "0     107036.13  600519  \n",
       "1      58234.48  600519  \n",
       "2      26287.43  600519  \n",
       "3      34501.20  600519  \n",
       "4      85566.70  600519  \n",
       "...         ...     ...  \n",
       "2421   24239.00  600519  \n",
       "2422   29224.00  600519  \n",
       "2423   44035.00  600519  \n",
       "2424   26899.00  600519  \n",
       "2425   19122.00  600519  \n",
       "\n",
       "[2426 rows x 8 columns]"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = pd.read_csv('./datasets/SH600519.csv')  # 读取股票文件\n",
    "\n",
    "data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "\"\"\"\n",
    "前(2426-300=2126)天的开盘价作为训练集,表格从0开始计数，2:3 是提取[2:3)列，前闭后开,故提取出C列开盘价\n",
    "后300天的开盘价作为测试集\n",
    "\"\"\"\n",
    "training_set = data.iloc[0:2426 - 300, 2:3].values  \n",
    "test_set = data.iloc[2426 - 300:, 2:3].values  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 四、数据预处理"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.归一化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "sc           = MinMaxScaler(feature_range=(0, 1))\n",
    "training_set = sc.fit_transform(training_set)\n",
    "test_set     = sc.transform(test_set) "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.设置测试集训练集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "x_train = []\n",
    "y_train = []\n",
    "\n",
    "x_test = []\n",
    "y_test = []\n",
    "\n",
    "\"\"\"\n",
    "使用前60天的开盘价作为输入特征x_train\n",
    "    第61天的开盘价作为输入标签y_train\n",
    "    \n",
    "for循环共构建2426-300-60=2066组训练数据。\n",
    "       共构建300-60=260组测试数据\n",
    "\"\"\"\n",
    "for i in range(60, len(training_set)):\n",
    "    x_train.append(training_set[i - 60:i, 0])\n",
    "    y_train.append(training_set[i, 0])\n",
    "    \n",
    "for i in range(60, len(test_set)):\n",
    "    x_test.append(test_set[i - 60:i, 0])\n",
    "    y_test.append(test_set[i, 0])\n",
    "    \n",
    "# 对训练集进行打乱\n",
    "np.random.seed(7)\n",
    "np.random.shuffle(x_train)\n",
    "np.random.seed(7)\n",
    "np.random.shuffle(y_train)\n",
    "tf.random.set_seed(7)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "\"\"\"\n",
    "将训练数据调整为数组（array）\n",
    "\n",
    "调整后的形状：\n",
    "x_train:(2066, 60, 1)\n",
    "y_train:(2066,)\n",
    "x_test :(240, 60, 1)\n",
    "y_test :(240,)\n",
    "\"\"\"\n",
    "x_train, y_train = np.array(x_train), np.array(y_train) # x_train形状为：(2066, 60, 1)\n",
    "x_test,  y_test  = np.array(x_test),  np.array(y_test)\n",
    "\n",
    "\"\"\"\n",
    "输入要求：[送入样本数， 循环核时间展开步数， 每个时间步输入特征个数]\n",
    "\"\"\"\n",
    "x_train = np.reshape(x_train, (x_train.shape[0], 60, 1))\n",
    "x_test  = np.reshape(x_test,  (x_test.shape[0], 60, 1))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 五、构建模型 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = tf.keras.Sequential([\n",
    "    SimpleRNN(80, return_sequences=True), #布尔值。是返回输出序列中的最后一个输出，还是全部序列。\n",
    "    Dropout(0.2),                         #防止过拟合\n",
    "    SimpleRNN(80),\n",
    "    Dropout(0.2),\n",
    "    Dense(1)\n",
    "])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 六、激活模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 该应用只观测loss数值，不观测准确率，所以删去metrics选项，一会在每个epoch迭代显示时只显示loss值\n",
    "model.compile(optimizer=tf.keras.optimizers.Adam(0.001),\n",
    "              loss='mean_squared_error')  # 损失函数用均方误差"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 七、训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/20\n",
      "33/33 [==============================] - 6s 123ms/step - loss: 0.1809 - val_loss: 0.0310\n",
      "Epoch 2/20\n",
      "33/33 [==============================] - 3s 105ms/step - loss: 0.0257 - val_loss: 0.0721\n",
      "Epoch 3/20\n",
      "33/33 [==============================] - 3s 85ms/step - loss: 0.0165 - val_loss: 0.0059\n",
      "Epoch 4/20\n",
      "33/33 [==============================] - 3s 85ms/step - loss: 0.0097 - val_loss: 0.0111\n",
      "Epoch 5/20\n",
      "33/33 [==============================] - 3s 90ms/step - loss: 0.0099 - val_loss: 0.0139\n",
      "Epoch 6/20\n",
      "33/33 [==============================] - 3s 105ms/step - loss: 0.0067 - val_loss: 0.0167\n",
      "Epoch 7/20\n",
      "33/33 [==============================] - 3s 86ms/step - loss: 0.0067 - val_loss: 0.0095\n",
      "Epoch 8/20\n",
      "33/33 [==============================] - 3s 91ms/step - loss: 0.0063 - val_loss: 0.0218\n",
      "Epoch 9/20\n",
      "33/33 [==============================] - 3s 99ms/step - loss: 0.0052 - val_loss: 0.0109\n",
      "Epoch 10/20\n",
      "33/33 [==============================] - 3s 99ms/step - loss: 0.0043 - val_loss: 0.0120\n",
      "Epoch 11/20\n",
      "33/33 [==============================] - 3s 92ms/step - loss: 0.0044 - val_loss: 0.0167\n",
      "Epoch 12/20\n",
      "33/33 [==============================] - 3s 89ms/step - loss: 0.0039 - val_loss: 0.0032\n",
      "Epoch 13/20\n",
      "33/33 [==============================] - 3s 88ms/step - loss: 0.0041 - val_loss: 0.0052\n",
      "Epoch 14/20\n",
      "33/33 [==============================] - 3s 93ms/step - loss: 0.0035 - val_loss: 0.0179\n",
      "Epoch 15/20\n",
      "33/33 [==============================] - 4s 110ms/step - loss: 0.0033 - val_loss: 0.0124\n",
      "Epoch 16/20\n",
      "33/33 [==============================] - 3s 95ms/step - loss: 0.0035 - val_loss: 0.0149\n",
      "Epoch 17/20\n",
      "33/33 [==============================] - 4s 111ms/step - loss: 0.0028 - val_loss: 0.0111\n",
      "Epoch 18/20\n",
      "33/33 [==============================] - 4s 110ms/step - loss: 0.0029 - val_loss: 0.0061\n",
      "Epoch 19/20\n",
      "33/33 [==============================] - 3s 104ms/step - loss: 0.0027 - val_loss: 0.0110\n",
      "Epoch 20/20\n",
      "33/33 [==============================] - 3s 90ms/step - loss: 0.0028 - val_loss: 0.0037\n",
      "Model: \"sequential\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "simple_rnn (SimpleRNN)       (None, 60, 80)            6560      \n",
      "_________________________________________________________________\n",
      "dropout (Dropout)            (None, 60, 80)            0         \n",
      "_________________________________________________________________\n",
      "simple_rnn_1 (SimpleRNN)     (None, 80)                12880     \n",
      "_________________________________________________________________\n",
      "dropout_1 (Dropout)          (None, 80)                0         \n",
      "_________________________________________________________________\n",
      "dense (Dense)                (None, 1)                 81        \n",
      "=================================================================\n",
      "Total params: 19,521\n",
      "Trainable params: 19,521\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "history = model.fit(x_train, y_train, \n",
    "                    batch_size=64, \n",
    "                    epochs=20, \n",
    "                    validation_data=(x_test, y_test), \n",
    "                    validation_freq=1)                  #测试的epoch间隔数\n",
    "\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 八、结果可视化"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.绘制loss图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(history.history['loss']    , label='Training Loss')\n",
    "plt.plot(history.history['val_loss'], label='Validation Loss')\n",
    "plt.title('Training and Validation Loss by K同学啊')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.预测"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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n87VV1+NW3Dxl19+4Zdffgn7eG+88QZvvPFGpfs98sgj9OjRg6FDh3LWWWeRk5MTdP8777wz7LFYLJYoM3s2/Pa30LQpLFlSraeOuFAYYwqNMbt9tzsNYJYbY3LQzmqDjTGDgK4i0hu1QLKd3QvRRjG+xx5njOlnjOnXokVYK9CrhbfeeotBgwbx/fffk5SUVLZy/EiFIhwefPBBfvjhB66//npeeumloPs+//zzVToWi8VSBXhbEu+/X62nrpasJxHphHa+cpuLzDbGHHKerwK6oP1y6znbkjlaEbvzToj05Ny3LwSZZNu2bcuECRO4+OKLGT9+PAB/+tOf+OQTbcT11ltvMW3aNA4dOsR1111HTk4OaWlpvP7665SWlnLdddeRlZVFkyZNmDhxYtlxly9fzu23386kSZNo2LBh0CEWFBRQr55+jRkZGZxyyiksWbKEKVOmlO2TkZHBjBkzAE0A8Hfea665hh07dnDCCSfwr3/9K9xvymKxRJrdzv33nDlw8snVeuoqz3pyYhbvoW02XUtjioi0FpH6aCerZcACPO6mPsCmqh5bpBk1ahR/+MMfuOSSS/j9739PSUkJTz31FPfffz/3338/06ZNA+CVV14hPT2d77//nq5du/Laa68xbtw4+vTpw48//sjo0aNZtky7a27dupUxY8bw7rvvBhWJJ554gqFDhzJnzhzuuOMOAObMmcOgQYPKiYQv/s47btw40tPT+eGHH9i6dStLqtnMtVgsfigs1Mfjj4da1buyoTrOdj/QDnjJyTJ5GG2EPh0oAl42xqwWka3ATBFpA4xE4xhHThTcK2vXruWcc85h9OjRXHXVVbz99ttce+21FfZbsWIFl1xyCQADBgxg8uTJFBcXM3r0aACuu+66sv3++c9/cuKJJ5KZmUmrVq0CnvvBBx/kqquuKrctPT297DyBWLVqVYXzvv7668yePZsZM2awa9cusrOz6d27d0jfgcViqSJci6JRo2o/dZUJhTEmw3m8D+3B60t3n/0LnSbxw4G/+4tzxDrjx4+nZ8+eXHvttaSnp5fl6NerV4/8/HxAF3r16tWLOXPmMGzYMObMmUOvXr04ePAgP//8M2eddRZPPvkkLVu2pHbt2jz00EOce+653HTTTXzzzTdhjSc5ObnSfbp3717hvN26daN///5cf/31fPHFF7Rr1y78L8Ni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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "predicted_stock_price = model.predict(x_test)                       # 测试集输入模型进行预测\n",
    "predicted_stock_price = sc.inverse_transform(predicted_stock_price) # 对预测数据还原---从（0，1）反归一化到原始范围\n",
    "real_stock_price = sc.inverse_transform(test_set[60:])              # 对真实数据还原---从（0，1）反归一化到原始范围\n",
    "\n",
    "# 画出真实数据和预测数据的对比曲线\n",
    "plt.plot(real_stock_price, color='red', label='Stock Price')\n",
    "plt.plot(predicted_stock_price, color='blue', label='Predicted Stock Price')\n",
    "plt.title('Stock Price Prediction by K同学啊')\n",
    "plt.xlabel('Time')\n",
    "plt.ylabel('Stock Price')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.评估"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "均方误差: 1833.92534\n",
      "均方根误差: 42.82435\n",
      "平均绝对误差: 36.23424\n",
      "R2: 0.72347\n"
     ]
    }
   ],
   "source": [
    "\"\"\"\n",
    "MSE  ：均方误差    ----->  预测值减真实值求平方后求均值\n",
    "RMSE ：均方根误差  ----->  对均方误差开方\n",
    "MAE  ：平均绝对误差----->  预测值减真实值求绝对值后求均值\n",
    "R2   ：决定系数，可以简单理解为反映模型拟合优度的重要的统计量\n",
    "\n",
    "详细介绍可以参考文章：https://blog.csdn.net/qq_38251616/article/details/107997435\n",
    "\"\"\"\n",
    "MSE   = metrics.mean_squared_error(predicted_stock_price, real_stock_price)\n",
    "RMSE  = metrics.mean_squared_error(predicted_stock_price, real_stock_price)**0.5\n",
    "MAE   = metrics.mean_absolute_error(predicted_stock_price, real_stock_price)\n",
    "R2    = metrics.r2_score(predicted_stock_price, real_stock_price)\n",
    "\n",
    "print('均方误差: %.5f' % MSE)\n",
    "print('均方根误差: %.5f' % RMSE)\n",
    "print('平均绝对误差: %.5f' % MAE)\n",
    "print('R2: %.5f' % R2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "往期精彩内容：\n",
    "\n",
    "- [**深度学习100例-卷积神经网络（CNN）实现mnist手写数字识别 | 第1天**](https://mtyjkh.blog.csdn.net/article/details/116920825)\n",
    "- [**深度学习100例-卷积神经网络（CNN）服装图像分类 | 第3天**](https://mtyjkh.blog.csdn.net/article/details/116992196)\n",
    "- [**深度学习100例-卷积神经网络（CNN）花朵识别 | 第4天**](https://mtyjkh.blog.csdn.net/article/details/117079919)\n",
    "- [**深度学习100例-卷积神经网络（CNN）天气识别 | 第5天**](https://mtyjkh.blog.csdn.net/article/details/117186183)\n",
    "- [**深度学习100例-卷积神经网络（VGG-16）识别海贼王草帽一伙 | 第6天**](https://blog.csdn.net/qq_38251616/article/details/117331631)\n",
    "- [**深度学习100例 -卷积神经网络（ResNet-50）鸟类识别 | 第8天**](https://mtyjkh.blog.csdn.net/article/details/117587326)\n",
    "\n",
    "**来自专栏：**[**【深度学习100例】**](https://blog.csdn.net/qq_38251616/category_11068756.html)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**需要数据的同学可以在评论中留下邮箱**，若时间久远可在文章左侧（电脑端可看）或者留言处寻找我的联系方式。\n",
    "\n",
    "**点个关注，给个赞，加个收藏，送我上热搜，谢谢大家拉！**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.8rc1"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": false,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {
    "height": "calc(100% - 180px)",
    "left": "10px",
    "top": "150px",
    "width": "165px"
   },
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
